package com.gitee.cnlongs.cnlongmq.server.engine;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.gitee.cnlongdb.server.connect.LongDbConnect;
import com.gitee.cnlongs.cnlongmq.server.threads.election.SequeueCaptainElectionThread;
import com.gitee.cnlongs.cnlongmq.server.threads.engine.AgainSendFailMqMessageThread;
import com.gitee.cnlongs.cnlongmq.server.threads.engine.ProcessMessageCompensateThread;
import com.gitee.cnlongs.cnlongmq.server.threads.engine.SequenceAvailableMonitorThread;

/**
 * 系统名称：LongMqEngine
 * 模块名称：
 * 模块描述：消息实时变化响应执行引擎
 * 功能列表：
 * 模块作者：zouyong
 * 开发时间：2019年4月17日 下午5:47:03
 * 模块路径：com.gitee.cnlongs.cnlongmq.server.engine.LongMqEngine
 */
public class LongMqEngine {
	
	// 线程池管理对象
	private static ScheduledExecutorService excutorService = Executors.newSingleThreadScheduledExecutor();
	private static LongDbConnect connect = null;

	/**
	 * 功能描述：开启消息实时监控变化执行引擎
	 × 模块作者：ZOUYONG
	 × 开发时间：2019年4月17日 下午5:48:51
	 × 返回数据：void
	 */
	public static void startEngineMonitor(LongDbConnect connect) {
		if(null == LongMqEngine.connect) {
			LongMqEngine.connect = connect;
		}
		// 启动【队列队长】选举机制
		startSequeueCaptainElection();
		// 开启【消息发送失败】重新发送消息的监听
		startAgainSendFailMqMessageMonitor();
		// 开启对【处理中的消息】进行补偿处理
		startProcessingMqMessageCompensate();
		// 开启队列可用性监听
		startSequenceAvailableMonitor();
	}

	/**
	 * 功能描述：启动【队列队长】选举机制
	 × 模块作者：ZOUYONG
	 × 开发时间：2019年8月1日 下午3:43:32
	 × 返回数据：void
	 */
	private static void startSequeueCaptainElection() {
		// 从现在开始，每隔5秒钟，执行一次选举检查工作
		excutorService.scheduleAtFixedRate(new SequeueCaptainElectionThread(connect), 0, 5, TimeUnit.SECONDS);
	}

	/**
	 * 功能描述：开启【消息发送失败】重新发送消息的监听
	 × 模块作者：ZOUYONG
	 × 开发时间：2019年4月17日 下午5:50:22
	 × 返回数据：void
	 */
	private static void startAgainSendFailMqMessageMonitor() {
		// 从现在开始，每隔5秒钟，执行一次线程操作
		excutorService.scheduleAtFixedRate(new AgainSendFailMqMessageThread(connect), 0, 5, TimeUnit.SECONDS);
	}

	/**
	 * 功能描述：开启对【处理中的消息】进行补偿处理
	 × 模块作者：ZOUYONG
	 × 开发时间：2019年5月9日 下午1:22:41
	 × 返回数据：void
	 */
	private static void startProcessingMqMessageCompensate() {
		// 从现在开始，每隔5秒钟，执行一次线程操作
		excutorService.scheduleAtFixedRate(new ProcessMessageCompensateThread(connect), 0, 5, TimeUnit.SECONDS);
	}

	/**
	 * 功能描述：开启队列可用性监听
	 * 模块作者：ZOUYONG
	 * 开发时间：2019年7月27日 上午10:34:12
	 * 更新记录：
	 * 返回数据：void
	 */
	private static void startSequenceAvailableMonitor() {
		// 从现在开始，每隔5秒钟，执行一次线程操作
		excutorService.scheduleAtFixedRate(new SequenceAvailableMonitorThread(connect), 0, 5, TimeUnit.SECONDS);
	}

}
